/**
 * 
 */
package com.google.code.cana.tests;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.google.code.cana.pojo.pessoas.Cliente;
import com.google.code.cana.service.ClienteService;
import com.google.code.cana.service.ObjetoNaoEncontradoException;

import junit.framework.TestCase;

/**
 * @author Rodrigo Barbosa Lira
 * @author Samuel de Barros Florentino
 * 
 */
public class ClienteTeste extends TestCase {

	private ClienteService clienteService;

	private Cliente cliente1;

	private Cliente cliente2;

	/*
	 * (non-Javadoc)
	 * 
	 * @see junit.framework.TestCase#setUp()
	 */
	protected void setUp() throws Exception {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		clienteService = (ClienteService) applicationContext.getBean("clienteService");
		
		cliente1 = new Cliente();
		cliente1.setNome("Cliente 1");
		
		cliente2 = new Cliente();
		cliente2.setNome("Cliente 2");
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see junit.framework.TestCase#tearDown()
	 */
	protected void tearDown() throws Exception {
		cliente1 = null;
		cliente2 = null;
		clienteService.apagarTodos();
	}

	/**
	 * Test method for
	 * {@link com.google.code.cana.service.ClienteServiceImpl#apagar(java.lang.Integer)}.
	 */
	public void testApagar() {
		int id1 = clienteService.criar(cliente1);
		assertEquals("Cliente 1", clienteService.recuperarPorId(id1).getNome());
		
		clienteService.apagar(id1);
		
		try {
			clienteService.recuperarPorId(id1);
			fail("Cliente nao foi removido");
		} catch (ObjetoNaoEncontradoException e) {}
		
		try {
			clienteService.apagar(id1);
			fail("Cliente nao foi removido");
		} catch (ObjetoNaoEncontradoException e) {}
	}

	/**
	 * Test method for
	 * {@link com.google.code.cana.service.ClienteServiceImpl#criar(com.google.code.cana.pojo.pessoas.Cliente)}.
	 */
	public void testCriar() {
		int id1 = clienteService.criar(cliente1);
		assertEquals("Cliente 1", clienteService.recuperarPorId(id1).getNome());
		assertNull(clienteService.recuperarPorId(id1).getEndereco());
		assertNull(clienteService.recuperarPorId(id1).getCnpj());
		
		int id2 = clienteService.criar(cliente2);
		assertEquals("Cliente 2", clienteService.recuperarPorId(id2).getNome());
		assertNull(clienteService.recuperarPorId(id2).getEndereco());
		assertNull(clienteService.recuperarPorId(id2).getCnpj());
		
	}

	/**
	 * Test method for
	 * {@link com.google.code.cana.service.ClienteServiceImpl#modificar(com.google.code.cana.pojo.pessoas.Cliente)}.
	 */
	public void testModificar() {
		int id1 = clienteService.criar(cliente1);
		int id2 = clienteService.criar(cliente2);
		
		cliente1.setNome("Cliente 1 Modificado");
		cliente1.setEndereco("Endereco do cliente 1");
		cliente1.setCnpj("000000000000");
		
		cliente2.setNome("Cliente 2 Modificado");
		cliente2.setEndereco("Endereco do cliente 2");
		cliente2.setCnpj("000000000001");
		
		clienteService.modificar(cliente1);
		clienteService.modificar(cliente2);
		
		assertEquals("Cliente 1 Modificado", clienteService.recuperarPorId(id1).getNome());
		assertEquals("Endereco do cliente 1", clienteService.recuperarPorId(id1).getEndereco());
		assertEquals("000000000000", clienteService.recuperarPorId(id1).getCnpj());
		
		assertEquals("Cliente 2 Modificado", clienteService.recuperarPorId(id2).getNome());
		assertEquals("Endereco do cliente 2", clienteService.recuperarPorId(id2).getEndereco());
		assertEquals("000000000001", clienteService.recuperarPorId(id2).getCnpj());
	}

	/**
	 * Test method for
	 * {@link com.google.code.cana.service.ClienteServiceImpl#recuperarPorId(java.lang.Integer)}.
	 */
	public void testRecuperarPorId() {
		int id1 = clienteService.criar(cliente1);
		assertEquals("Cliente 1", clienteService.recuperarPorId(id1).getNome());
		assertNull(clienteService.recuperarPorId(id1).getEndereco());
		assertNull(clienteService.recuperarPorId(id1).getCnpj());
		
		int id2 = clienteService.criar(cliente2);
		assertEquals("Cliente 2", clienteService.recuperarPorId(id2).getNome());
		assertNull(clienteService.recuperarPorId(id2).getEndereco());
		assertNull(clienteService.recuperarPorId(id2).getCnpj());
	}

}
